package com.demo.java.OD601_650.OD614;

import java.util.Scanner;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【最大化控制资源成本(B卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146606540
 */
public class OdMain {
    public static void main(String[] args) {
        // 输入处理
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(); // 任务数量
        int[][] ranges = new int[n][3]; // 用二维数组存储每个任务的时间段和并行度
        for (int i = 0; i < n; i++) {
            ranges[i][0] = in.nextInt(); // 任务开始时间
            ranges[i][1] = in.nextInt(); // 任务结束时间
            ranges[i][2] = in.nextInt(); // 任务的并行度
        }

        // 调用最少服务器计算方法并输出结果
        System.out.println(minMeetingRooms(ranges));
    }

    // 计算最少服务器数的函数
    public static int minMeetingRooms(int[][] ranges) {
        // 按照任务的开始时间进行排序
        Arrays.sort(ranges, (a, b) -> a[0] - b[0]);

        // 使用优先队列来存储当前正在执行的任务的结束时间和并行度
        PriorityQueue<Integer[]> pq = new PriorityQueue<>((a, b) -> a[0] - b[0]);

        int res = 0; // 记录最少需要的服务器数
        int temp_res = 0; // 临时记录当前并发使用的服务器数

        // 遍历所有任务
        for (int i = 0; i < ranges.length; i++) {
            // 检查并清除已完成的任务
            while (pq.size() > 0) {
                Integer[] top = pq.peek();
                // 如果队列中最早完成的任务结束时间小于当前任务的开始时间，说明可以复用这个服务器
                if (top[0] < ranges[i][0]) {
                    Integer[] poll = pq.poll(); // 移除已完成的任务
                    temp_res -= poll[1]; // 减去该任务的并行度
                } else {
                    break; // 如果没有任务结束，退出循环
                }
            }

            // 将当前任务加入队列
            pq.offer(new Integer[]{ranges[i][1], ranges[i][2]});
            temp_res += ranges[i][2]; // 增加当前任务的并行度

            // 更新最小服务器数
            if (temp_res > res) {
                res = temp_res;
            }
        }
        return res; // 返回最少需要的服务器数
    }
}